server-side-props.ts 2.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. import type { GetServerSidePropsContext, GetServerSidePropsResult } from 'next';
  2. import { getServerSideBasicLayoutProps } from '../basic-layout-page';
  3. import {
  4. getServerSideCommonInitialProps,
  5. getServerSideI18nProps,
  6. } from '../common-props';
  7. import {
  8. getActivityAction,
  9. getServerSideGeneralPageProps,
  10. getServerSideRendererConfigProps,
  11. } from '../general-page';
  12. import { isValidGeneralPageInitialProps } from '../general-page/type-guards';
  13. import { addActivity } from '../utils/activity';
  14. import { mergeGetServerSidePropsResults } from '../utils/server-side-props';
  15. import { NEXT_JS_ROUTING_PAGE } from './consts';
  16. import {
  17. getPageDataForInitial,
  18. getPageDataForSameRoute,
  19. } from './page-data-props';
  20. import type { Stage2EachProps, Stage2InitialProps } from './types';
  21. const nextjsRoutingProps = {
  22. props: {
  23. nextjsRoutingPage: NEXT_JS_ROUTING_PAGE,
  24. },
  25. };
  26. export async function getServerSidePropsForInitial(
  27. context: GetServerSidePropsContext,
  28. ): Promise<GetServerSidePropsResult<Stage2InitialProps>> {
  29. const [
  30. commonInitialResult,
  31. basicLayoutResult,
  32. generalPageResult,
  33. rendererConfigResult,
  34. i18nPropsResult,
  35. pageDataResult,
  36. ] = await Promise.all([
  37. getServerSideCommonInitialProps(context),
  38. getServerSideBasicLayoutProps(context),
  39. getServerSideGeneralPageProps(context),
  40. getServerSideRendererConfigProps(context),
  41. getServerSideI18nProps(context, ['translation']),
  42. getPageDataForInitial(context),
  43. ]);
  44. // Merge all results in a type-safe manner (using sequential merging)
  45. const mergedResult = mergeGetServerSidePropsResults(
  46. commonInitialResult,
  47. mergeGetServerSidePropsResults(
  48. basicLayoutResult,
  49. mergeGetServerSidePropsResults(
  50. generalPageResult,
  51. mergeGetServerSidePropsResults(
  52. rendererConfigResult,
  53. mergeGetServerSidePropsResults(
  54. i18nPropsResult,
  55. mergeGetServerSidePropsResults(pageDataResult, nextjsRoutingProps),
  56. ),
  57. ),
  58. ),
  59. ),
  60. );
  61. // Check for early return (redirect/notFound)
  62. if ('redirect' in mergedResult || 'notFound' in mergedResult) {
  63. return mergedResult;
  64. }
  65. const mergedProps = await mergedResult.props;
  66. // Type-safe props validation AFTER skipSSR is properly set
  67. if (!isValidGeneralPageInitialProps(mergedProps)) {
  68. throw new Error('Invalid merged props structure');
  69. }
  70. // -- TODO: persist activity
  71. // await addActivity(context, getActivityAction(mergedProps));
  72. return mergedResult;
  73. }
  74. export async function getServerSidePropsForSameRoute(
  75. context: GetServerSidePropsContext,
  76. ): Promise<GetServerSidePropsResult<Stage2EachProps>> {
  77. // Get page data
  78. const result = await getPageDataForSameRoute(context);
  79. // -- TODO: persist activity
  80. // const mergedProps = await mergedResult.props;
  81. // await addActivity(context, getActivityAction(mergedProps));
  82. return result;
  83. }